<?php
namespace Lib\Base;

class Config
{
    const TEST_ENV_IP = [
        '10.239.169.134',
        '9.79.13.63',
        '9.67.164.115',
        '100.113.226.215',
    ];
    /**
     *
     *  获取线上环境的配置文件(token和secret)
     *
     * @param  string $sAppId Ulink平台应用ID
     * @param  string $key 需要获取的key的值，默认空，获取APPID下所有配置信息
     * @return array|bool
     */
    public static function getOnlineConfig($sAppId, $key = '')
    {
        //global $ULINK_APP_CONFIG;
        if (!$sAppId) {
            return false;
        }
        $file = CONFIG_PATH . "/app/{$sAppId}.cfg";
        //if (empty($ULINK_APP_CONFIG)) {
        $ULINK_APP_CONFIG = parse_ini_file($file, true);
        //}

        if (!$ULINK_APP_CONFIG) {
            recordLog('config file read error', __FILE__, __LINE__, LP_ERROR);
            return false;
        } else if (!$ULINK_APP_CONFIG[$sAppId]) {
            recordLog('sAppId config read error', __FILE__, __LINE__, LP_ERROR);
            return false;
        } else {
            if ($key != '') {
                if (isset($ULINK_APP_CONFIG[$sAppId][$key])) {
                    return $ULINK_APP_CONFIG[$sAppId][$key];
                } else {
                    recordLog($key . ' not exist!', __FILE__, __LINE__, LP_ERROR);
                    return false;
                }
            } else {
                return $ULINK_APP_CONFIG[$sAppId];
            }
        }
    }

    /**
     * 获取业务配置信息
     * @param string $serviceType 业务代码
     * @param string $name 要获取配置文件中的key
     * @return string|array $name 为空则返回所有配置信息，$name 不为空返回name对应的值
     */
    public static function getBizInfo($serviceType, $name = '')
    {
        if (empty($serviceType)) {
            recordLog('serviceType is empty', __FILE__, __LINE__, LP_ERROR);
            return false;
        }
        $file = '/data/website/configweb/cfg/ulink/config/biz/' . $serviceType . '.cfg';
        if (file_exists($file)) {
            $config = parse_ini_file($file, true);
            if ($name != '') {
                if (isset($config[$serviceType][$name])) {
                    return $config[$serviceType][$name];
                } else {
                    recordLog("key {$name} not exist!", __FILE__, __LINE__, LP_ERROR);
                    return false;
                }
            } else {
                return $config;
            }
        } else {
            recordLog("$file not exist!", __FILE__, __LINE__, LP_ERROR);
            return false;
        }
    }

    /**
     * 获取活动配置文件
     * @param int $actId 要获取配置的活动号
     * @return array|false 配置文件不存在时返回false,存在则返回配置信息数组
     */
    public static function getActConfig($actId, &$file = '')
    {
        global $ULINK_ACT_CONFIG;
        if (!empty($ULINK_ACT_CONFIG)) {
            return $ULINK_ACT_CONFIG;
        }

        $id1 = str_pad($actId, 6, '0', STR_PAD_LEFT);
        $file = CONFIG_PATH . '/act/' . substr($id1, 0, 2) . '/' . substr($id1, 2, 2) . '/' . $actId . (ENV != 'pro' ? '.test' : '') . '.cfg';
        if (file_exists($file)) {
            $ULINK_ACT_CONFIG = parse_ini_file($file, true);
            return $ULINK_ACT_CONFIG;
        } else {
            recordLog("配置文件" . $file . "不存在!", __FILE__, __LINE__, LP_ERROR);
            return false;
        }
    }

    /**
     * 获取短信、邮件等配置信息
     * @param int $msgId 配置之后生成的模板ID
     * @param string $msgKey MSGINFO-短信配置，MAILINFO-邮件配置
     * @return array
     */
    public static function getMsgConfig($msgId, $msgKey = '')
    {
        $id1 = str_pad($msgId, 6, '0', STR_PAD_LEFT);
        $file = CONFIG_PATH . '/msg/' . substr($id1, 0, 2) . '/' . substr($id1, 2, 2) . '/' . $msgId . '.cfg';
        if (file_exists($file)) {
            $data = parse_ini_file($file, true);
            if ($msgKey != '' && isset($data[$msgKey])) {
                return $data[$msgKey];
            }
            return $data;
        } else {
            recordLog("配置文件" . $file . "不存在!", __FILE__, __LINE__, LP_ERROR);
            return false;
        }
    }

    /**
     * 获取全局配置文件
     * @return array|false 配置文件不存在时返回false,存在则返回配置信息数组
     */
    public static function getBaseConfig()
    {
        global $ULINK_BASE_CONFIG;
        if (!empty($ULINK_BASE_CONFIG)) {
            return $ULINK_BASE_CONFIG;
        }
        $file = CONFIG_PATH . '/base.cfg';
        if (file_exists($file)) {
            $ULINK_BASE_CONFIG = parse_ini_file($file, true);
            return $ULINK_BASE_CONFIG;
        } else {
            recordLog("配置文件" . $file . "不存在!", __FILE__, __LINE__, LP_ERROR);
            return false;
        }
    }

    /**
     * 获取活动自定义数据
     * @param string $name 要获取参数的名称，如果不传，则获取所有自定义数据
     * @return string|array 参数值
     */
    public static function getCustomParam($name = '')
    {
        $actId = Request::getParam('iActId');
        if (ENV != 'test') {
            $actConfig = self::getActConfig($actId);
            if ($actConfig === false) {
                return false;
            }
            if ($name == '') {
                return $actConfig['CUSTOM_CFG'];
            }
            return isset($actConfig['CUSTOM_CFG'][$name]) ? $actConfig['CUSTOM_CFG'][$name] : '';
        } else {
            $file = APP_PATH . DIRECTORY_SEPARATOR . 'custom.cfg';
            if (file_exists($file)) {
                $config = parse_ini_file($file, true);
                if ($config['CUSTOM_CFG']) {
                    if ($name == '') {
                        return $config['CUSTOM_CFG'];
                    }
                    return isset($config['CUSTOM_CFG'][$name]) ? $config['CUSTOM_CFG'][$name] : '';
                } else {
                    recordLog("配置文件" . $file . "格式错误!", __FILE__, __LINE__, LP_ERROR);
                    return false;
                }
            } else {
                recordLog("配置文件" . $file . "不存在!", __FILE__, __LINE__, LP_ERROR);
                return false;
            }
        }
    }

    /**
     * 获取应用加密用的secretKey
     * @return string|bool 成功返回key,失败返回false
     */
    public static function getSecretKey()
    {
        if (ENV != 'test') {
            $config = explode('-', ULINK_SAPPID)[1];
            $secretKey = self::getOnlineConfig($config, 'secret');
            if (!$secretKey) {
                recordLog('pro secretKey read error', __FILE__, __LINE__, LP_ERROR);
                return false;
            }
        } else {
            $secretKey = ULINK_SECRET; //测试环境通过配置文件中定义的常量来获取
        }
        return $secretKey;
    }

    /**
     * 获取应用的stoken
     * @return string|bool 成功返回token,失败返回false
     */
    public static function getsToken()
    {
        $sToken = '';
        if (ENV != 'test') {
            $config = explode('-', ULINK_SAPPID)[1];
            $sToken = self::getOnlineConfig($config, 'sToken');
            if (!$sToken) {
                recordLog('pro sToken read error', __FILE__, __LINE__, LP_ERROR);
                $sToken = false;
            }
        } else {
            $sToken = ULINK_STOKEN; //测试环境通过配置文件中定义的常量来获取
        }
        return $sToken;
    }

    /**
     * 根据业务代码获取业务对应的appid
     */
    public static function getAppid($serviceType)
    {
        $appidData = ['appidQQ' => '', 'appidWX' => ''];

        if ($serviceType != '') {
            if (RUN_ENV == 'internal') {
                $file = '/usr/local/commweb/cfg/CommConfig/mobile/mobile_appid.cfg';
                if (file_exists($file)) {
                    $data = parse_ini_file($file, true);
                    if (isset($data['APPID_LIST'][$serviceType])) {
                        $appidData['appidqq'] = $data['APPID_LIST'][$serviceType];
                    }
                    if (isset($data['APPID_LIST'][$serviceType . '_appid'])) {
                        $appidData['appidwx'] = $data['APPID_LIST'][$serviceType . '_appid'];
                    }
                    return $appidData;
                } else {
                    recordLog("配置文件" . $file . "不存在!", __FILE__, __LINE__, LP_ERROR);
                    return false;
                }
            }
        }
    }

    /**
     * 根据appid查询serviceType
     */
    public static function getSvrTypeByAppid($appid)
    {
        if ($appid != '') {
            if (RUN_ENV == 'internal') {
                $file = '/usr/local/commweb/cfg/CommConfig/mobile/mobile_appid.cfg';
                if (file_exists($file)) {
                    $data = parse_ini_file($file, true);
                    //QQ appid
                    if (is_numeric($appid)) {
                        $key = array_search($appid, $data['APPID_LIST']);
                    } else {
                        //微信 appid
                        $key = array_search($appid, $data['WXAPPID_LIST']);
                    }
                    if ($key === false) {
                        recordLog("配置文件没有查询到appid={$appid}对应的业务，请检查是否已经接入ams系统！", __FILE__, __LINE__, LP_ERROR);
                        return false;
                    }
                    if (strpos($key, '_appid') !== false) {
                        return str_replace('_appid', '', $key);
                    } else {
                        return $key;
                    }

                } else {
                    recordLog("配置文件" . $file . "不存在!", __FILE__, __LINE__, LP_ERROR);
                    return false;
                }
            }
        } else {
            recordLog("要查询的appid不能为空！", __FILE__, __LINE__, LP_ERROR);
            return false;
        }
    }

    /**
     * 获取框架配置信息
     */
    public static function getFrameworkCfg($section = '', $key = '')
    {
        if (in_array($_SERVER['SERVER_ADDR'], self::TEST_ENV_IP)) {
            $file = '/data/website/apps7web/cfg/ntxframework/framework_test.cfg';
        } else {
            $file = '/data/website/apps7web/cfg/ntxframework/framework.cfg';
        }
        return self::getConfig($file, $section, $key);
    }

    /**
     * 解析配置文件
     * @param string $file 要解析的配置文件名称（绝对路径）
     * @param string $section 要读取的配置文件中段的信息，为空则返回整个配置文件
     * @param string $key 要读取
     */
    public static function getConfig($file, $section = '', $key = '')
    {
        if (file_exists($file)) {
            $data = parse_ini_file($file, true);
            if ($data === false) {
                recordLog("配置文件：{$file}解析失败！", __FILE__, __LINE__, LP_ERROR);
                return false;
            }
            $sectionData = [];
            if ($section !== '') {
                if (isset($data[$section])) {
                    $sectionData = $data[$section];
                } else {
                    recordLog("配置文件：{$file}中没有查询到{$section}相关的信息！", __FILE__, __LINE__, LP_ERROR);
                    return false;
                }
                if ($key !== '') {
                    if (isset($sectionData[$key])) {
                        return $sectionData[$key];
                    } else {
                        recordLog("配置文件：{$file}中没有查询到{$key}相关的信息！", __FILE__, __LINE__, LP_ERROR);
                    }
                }
                return $sectionData;
            } else {
                return $data;
            }
        } else {
            recordLog("配置文件" . $file . "不存在!", __FILE__, __LINE__, LP_ERROR);
            return false;
        }
    }
}
